/**
 * @file error_codes.h
 * @brief 104协议错误码定义
 * @author 电网104协议开发团队
 * @date 2024
 */

#ifndef ERROR_CODES_H
#define ERROR_CODES_H

#ifdef __cplusplus
extern "C" {
#endif

/* ==================== 错误码定义 ==================== */

/**
 * @brief 协议错误码枚举
 */
typedef enum {
    PROTOCOL_SUCCESS = 0,                    /* 成功 */
    
    /* 通用错误码 (1-99) */
    PROTOCOL_ERROR_INVALID_PARAM = 1,         /* 无效参数 */
    PROTOCOL_ERROR_NULL_POINTER = 2,          /* 空指针 */
    PROTOCOL_ERROR_BUFFER_TOO_SMALL = 3,      /* 缓冲区太小 */
    PROTOCOL_ERROR_BUFFER_OVERFLOW = 4,       /* 缓冲区溢出 */
    PROTOCOL_ERROR_INVALID_LENGTH = 5,        /* 无效长度 */
    PROTOCOL_ERROR_CHECKSUM_MISMATCH = 6,     /* 校验和不匹配 */
    PROTOCOL_ERROR_TIMEOUT = 7,               /* 超时 */
    PROTOCOL_ERROR_MEMORY_ALLOCATION = 8,     /* 内存分配失败 */
    PROTOCOL_ERROR_INVALID_FORMAT = 9,        /* 无效格式 */
    PROTOCOL_ERROR_NOT_IMPLEMENTED = 10,      /* 未实现 */
    
    /* APDU错误码 (100-199) */
    PROTOCOL_ERROR_APDU_INVALID_START = 100,  /* 无效启动字符 */
    PROTOCOL_ERROR_APDU_INVALID_LENGTH = 101, /* 无效长度 */
    PROTOCOL_ERROR_APDU_INVALID_CONTROL = 102, /* 无效控制域 */
    PROTOCOL_ERROR_APDU_SEQUENCE_ERROR = 103, /* 序列号错误 */
    PROTOCOL_ERROR_APDU_FORMAT_ERROR = 104,   /* 格式错误 */
    
    /* ASDU错误码 (200-299) */
    PROTOCOL_ERROR_ASDU_INVALID_TYPE = 200,   /* 无效类型标识 */
    PROTOCOL_ERROR_ASDU_INVALID_VSQ = 201,    /* 无效可变结构限定词 */
    PROTOCOL_ERROR_ASDU_INVALID_COT = 202,    /* 无效传送原因 */
    PROTOCOL_ERROR_ASDU_INVALID_ADDRESS = 203, /* 无效地址 */
    PROTOCOL_ERROR_ASDU_DATA_MISMATCH = 204,  /* 数据不匹配 */
    PROTOCOL_ERROR_ASDU_INVALID = 205,        /* ASDU无效 */
    
    /* 数据类型错误码 (300-399) */
    PROTOCOL_ERROR_DATA_INVALID_VALUE = 300,  /* 无效数据值 */
    PROTOCOL_ERROR_DATA_OUT_OF_RANGE = 301,   /* 数据超出范围 */
    PROTOCOL_ERROR_DATA_INVALID_QUALITY = 302, /* 无效品质描述词 */
    PROTOCOL_ERROR_DATA_INVALID_TIMESTAMP = 303, /* 无效时间戳 */
    PROTOCOL_ERROR_DATA_CONVERSION_FAILED = 304, /* 数据转换失败 */
    
    /* 连接错误码 (400-499) */
    PROTOCOL_ERROR_CONNECTION_FAILED = 400,  /* 连接失败 */
    PROTOCOL_ERROR_ALREADY_CONNECTED = 401,  /* 已经连接 */
    PROTOCOL_ERROR_NOT_CONNECTED = 402,      /* 未连接 */
    PROTOCOL_ERROR_CONNECTION_LOST = 403,    /* 连接丢失 */
    PROTOCOL_ERROR_CONNECTION_REFUSED = 404, /* 连接被拒绝 */
    PROTOCOL_ERROR_CONNECTION_TIMEOUT = 405, /* 连接超时 */
    
    /* 文件传输错误码 (500-599) */
    PROTOCOL_ERROR_FILE_NOT_FOUND = 500,     /* 文件未找到 */
    PROTOCOL_ERROR_FILE_ACCESS_DENIED = 501,  /* 文件访问被拒绝 */
    PROTOCOL_ERROR_FILE_TRANSFER_FAILED = 502, /* 文件传输失败 */
    PROTOCOL_ERROR_FILE_CHECKSUM_ERROR = 503, /* 文件校验和错误 */
    PROTOCOL_ERROR_FILE_SIZE_MISMATCH = 504,  /* 文件大小不匹配 */
    
    /* 参数错误码 (600-699) */
    PROTOCOL_ERROR_PARAM_INVALID_ID = 600,   /* 无效参数ID */
    PROTOCOL_ERROR_PARAM_READ_FAILED = 601,  /* 参数读取失败 */
    PROTOCOL_ERROR_PARAM_WRITE_FAILED = 602, /* 参数写入失败 */
    PROTOCOL_ERROR_PARAM_VALIDATION_FAILED = 603, /* 参数验证失败 */
    
    /* 系统错误码 (700-799) */
    PROTOCOL_ERROR_SYSTEM_INIT_FAILED = 700,  /* 系统初始化失败 */
    PROTOCOL_ERROR_SYSTEM_NOT_READY = 701,   /* 系统未就绪 */
    PROTOCOL_ERROR_SYSTEM_BUSY = 702,         /* 系统忙 */
    PROTOCOL_ERROR_SYSTEM_SHUTDOWN = 703,   /* 系统关闭 */
    PROTOCOL_ERROR_SYSTEM_ERROR = 704,       /* 系统错误 */
    
    /* 通信错误码 (800-899) */
    PROTOCOL_ERROR_COMM_LINK_DOWN = 800,     /* 通信链路断开 */
    PROTOCOL_ERROR_COMM_TIMEOUT = 801,       /* 通信超时 */
    PROTOCOL_ERROR_COMM_FRAME_ERROR = 802,  /* 通信帧错误 */
    PROTOCOL_ERROR_COMM_PROTOCOL_ERROR = 803, /* 通信协议错误 */
    
    /* 未知错误 */
    PROTOCOL_ERROR_UNKNOWN = 999             /* 未知错误 */
} protocol_error_t;

/* ==================== 错误处理函数 ==================== */

/**
 * @brief 获取错误码对应的错误描述
 * @param error_code 错误码
 * @return 错误描述字符串
 */
const char* protocol_get_error_string(protocol_error_t error_code);

/**
 * @brief 检查错误码是否为成功
 * @param error_code 错误码
 * @return 成功返回true，失败返回false
 */
int protocol_is_success(protocol_error_t error_code);

/**
 * @brief 检查错误码是否为致命错误
 * @param error_code 错误码
 * @return 致命错误返回true，否则返回false
 */
int protocol_is_fatal_error(protocol_error_t error_code);

/**
 * @brief 检查错误码是否为可恢复错误
 * @param error_code 错误码
 * @return 可恢复错误返回true，否则返回false
 */
int protocol_is_recoverable_error(protocol_error_t error_code);

/* ==================== 错误码转换函数 ==================== */

/**
 * @brief 将buffer_error_t转换为protocol_error_t
 * @param buffer_error 缓冲区错误码
 * @return 对应的协议错误码
 * 
 * @note 用于消除枚举类型隐式转换警告
 */
protocol_error_t buffer_error_to_protocol_error(int buffer_error);

#ifdef __cplusplus
}
#endif

#endif /* ERROR_CODES_H */
